﻿
namespace FastFood.Windows.Forms.Administracion.Comestibles
{
    using System;
    using System.Collections.Generic;
    using System.Data.Linq;
    using System.Drawing;
    using System.Linq;
    using System.Windows.Forms;
    using FastFood.Business.Entities;
    using FastFood.Business.Logic;
    using FastFood.Windows.Helpers;

    public partial class CwfPreparables : UserControl
    {
        public EstadoActual estadoActual;
        private Font font;

        public decimal Costo
        {
            set { costoTextBox.Text = value.ToString(); }
        }
        
        public CwfPreparables()
        {
            InitializeComponent();
            SetFont();
        }

        private void CwfPlatos_Load(object sender, EventArgs e)
        {
            if (!DesignMode)
            {
                this.TsMenu.FormularioID = Convert.ToByte(this.Tag);
                this.TsMenu.LoadPermisos();
                this.cwfPreparacion1.miCwfPreparables = this;
                ClearControls();
                InitialLoad();
                EnabledControls(true);
                EnabledButtons(true);
            }
        }

        private void Focus_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == Convert.ToChar(Keys.Enter))
            {
                e.Handled = true;
                SendKeys.Send("{TAB}");
            }
        }

        private void TsbNuevo_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Nuevo;
            EnabledControls(false);
            EnabledButtons(false);
            ClearControls();
            this.cwfPreparacion1.ListaPreparacion = new List<Productos_Insumos>();
            this.cwfPreparacion1.InitialLoad();
            splitContainer3.Focus();
            this.nombreTextBox.Focus();
            this.productoBindingSource.AddNew();
        }

        private void TsbEditar_Click(object sender, EventArgs e)
        {
            this.estadoActual = EstadoActual.Editar;
            EnabledControls(false);
            EnabledButtons(false);
            this.nombreTextBox.Focus();
        }

        private void TsbEliminar_Click(object sender, EventArgs e)
        {
            if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.Yes)
            {
                this.estadoActual = EstadoActual.Eliminar;
                SaveData();
                this.estadoActual = EstadoActual.Normal;
                if (this.productoBindingSource.Current != null)
                {
                    LoadProducto(this.productoBindingSource.Current as Productos);
                }
            }
        }

        private void TsbGuardar_Click(object sender, EventArgs e)
        {
            if (ValidateData())
            {
                if (SaveData())
                {
                    this.estadoActual = EstadoActual.Normal;
                    if (this.productoBindingSource.Current != null)
                    {
                        LoadProducto(this.productoBindingSource.Current as Productos);
                    }
                    EnabledControls(true);
                    EnabledButtons(true);
                    this.productoDataGridView.Focus();
                }
            }
        }

        private void TsbCancelar_Click(object sender, EventArgs e)
        {
            if (this.estadoActual == EstadoActual.Nuevo)
            {
                ClearControls();
                this.cwfPreparacion1.ListaPreparacion = new List<Productos_Insumos>();
                this.cwfPreparacion1.InitialLoad();
                this.cwfPreparacion1.ClearControls();
            }
            this.estadoActual = EstadoActual.Normal;
            EnabledControls(true);
            EnabledButtons(true);
            this.productoBindingSource.CancelEdit();
            this.productoDataGridView.Focus();
        }

        private void platoDataGridView_CellEnter(object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1 && e.ColumnIndex != -1)
            {
                if (this.estadoActual == EstadoActual.Normal)
                    LoadProducto(this.productoBindingSource.Current as Productos);
            }
        }

        private void platoDataGridView_KeyDown(object sender, KeyEventArgs e)
        {
            if (this.estadoActual != EstadoActual.Normal) return;
            if (e.KeyCode == Keys.Delete)
            {
                if (this.productoDataGridView.SelectedRows.Count != 0)
                {
                    if (Mensaje.ShowMessageConfirm(this.ParentForm, Constantes.Titulo, "¿Desea eliminar el Registro?") == DialogResult.No)
                    {
                        e.Handled = true;
                    }
                    else
                    {
                        this.estadoActual = EstadoActual.Eliminar;
                        SaveData();
                        this.estadoActual = EstadoActual.Normal;
                        if (this.productoBindingSource.Current != null)
                        {
                            LoadProducto(this.productoBindingSource.Current as Productos);
                        }
                    }
                }
            }
        }

        private void InitialLoad()
        {
            try
            {
                ProductosManager productoManager = new ProductosManager();
                var temp = productoManager.Listar();
                this.productoBindingSource.DataSource = temp;
                this.productoBindingNavigator.BindingSource = this.productoBindingSource;
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
        }

        private void LoadProducto(Productos producto)
        {
            producto = new ProductosManager().Obtener(producto.productoID);
            this.nombreTextBox.Text = producto.nombre;
            this.costoTextBox.Text = producto.costo.ToString();
            this.precioTextBox.Text = producto.precio.ToString();
            this.productoIDLabel.Text = producto.productoID.ToString();
            this.descripcionTextBox.Text = producto.descripcion;
            this.cwfPreparacion1.ListaPreparacion = producto.Productos_Insumos.ToList() ?? new List<Productos_Insumos>();
            this.cwfPreparacion1.InitialLoad();            
        }

        private bool SaveData()
        {
            bool result = false;
            try
            {
                ProductosManager productoManager = new ProductosManager();

                switch (this.estadoActual)
                {
                    case EstadoActual.Nuevo:
                        productoManager.Agregar(GetProducto());
                        break;
                    case EstadoActual.Editar:
                        productoManager.Modificar(GetProducto());
                        break;
                    case EstadoActual.Eliminar:
                        productoManager.Eliminar(Convert.ToInt16(this.productoIDLabel.Text));
                        this.productoBindingSource.RemoveCurrent();
                        break;
                }

                this.productoBindingSource.EndEdit();
                result = true;
                InitialLoad();
            }
            catch (Exception ex)
            {
                Mensaje.ShowMessageAlert(this.ParentForm, Constantes.Titulo, ex.Message);
            }
            return result;
        }

        private Productos GetProducto()
        {
            Productos producto = new Productos()
            {
                productoID = Convert.ToInt16(productoIDLabel.Text),
                nombre = nombreTextBox.Text,
                precio = Convert.ToDecimal(precioTextBox.Text),
                descripcion = descripcionTextBox.Text
            };
            producto.Productos_Insumos = new EntitySet<Productos_Insumos>();
            producto.Productos_Insumos.AddRange(cwfPreparacion1.ListaPreparacion);
            return producto;
        }

        private bool ValidateData()
        {
            bool result = true;

            if (string.IsNullOrEmpty(nombreTextBox.Text))
            {
                this.errValidator.SetError(this.nombreTextBox, "Ingresar Nombre.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.nombreTextBox, string.Empty);
            }
            
            if (string.IsNullOrEmpty(precioTextBox.Text))
            {
                this.errValidator.SetError(this.precioTextBox, "Ingresar Precio.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.precioTextBox, string.Empty);
            }

            if (cwfPreparacion1.ListaPreparacion.Count == 0)
            {
                this.errValidator.SetError(this.DetalleLabel, "Ingresar el Detalle.");
                result = false;
            }
            else
            {
                this.errValidator.SetError(this.DetalleLabel, string.Empty);
            }
            
            return result;
        }

        private void EnabledControls(bool valor)
        {
            this.gbxInformacion.Enabled = !valor;
            this.cwfPreparacion1.Enabled = !valor;
            this.productoBindingNavigator.Enabled = valor;
            this.productoDataGridView.Enabled = valor;
        }

        private void EnabledButtons(bool valor)
        {
            this.TsMenu.EnabledNuevo = valor;
            this.TsMenu.EnabledEditar = valor;
            this.TsMenu.EnabledEliminar = valor;

            if (this.estadoActual == EstadoActual.Nuevo ||
                this.estadoActual == EstadoActual.Editar)
            {
                this.TsMenu.EnabledGuardar = true;
                this.TsMenu.EnabledCancelar = true;
                this.productoDataGridView.Enabled = false;
            }
            else
            {
                this.TsMenu.EnabledGuardar = false;
                this.TsMenu.EnabledCancelar = false;
                this.productoDataGridView.Enabled = true;
            }
        }

        private void ClearControls()
        {
            this.productoIDLabel.Text = "0";
            this.nombreTextBox.Text = string.Empty;
            this.costoTextBox.Text = "0";
            this.precioTextBox.Text = string.Empty;
            this.descripcionTextBox.Text = string.Empty;
            this.errValidator.Clear();
        }

        private void SetFont()
        {
            this.font = SystemFonts.IconTitleFont;
            if (this.Font != font)
            {
                this.Font = this.font;
                this.font = new Font("Tahoma", 7);
                this.productoDataGridView.RowTemplate.Height = (TextRenderer.MeasureText("I", this.font).Height + 5) * 3;
            }
        }

        private void platoDataGridView_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
        {
            if ((e.ColumnIndex >= 0) && (e.RowIndex >= 0))
            {
                Graphics g = e.Graphics;
                bool selected = ((e.State & DataGridViewElementStates.Selected) == DataGridViewElementStates.Selected);
                System.Drawing.Color fcolor = (selected ? e.CellStyle.SelectionForeColor : e.CellStyle.ForeColor);
                System.Drawing.Color bcolor = (selected ? e.CellStyle.SelectionBackColor : e.CellStyle.BackColor);
                Font font = e.CellStyle.Font;
                font = new Font("Tahoma", 7);

                Productos producto = this.productoBindingSource[e.RowIndex] as Productos;

                if (producto != null)
                {
                    int x = e.CellBounds.Left + e.CellStyle.Padding.Left;
                    int y = e.CellBounds.Top + e.CellStyle.Padding.Top;
                    int width = e.CellBounds.Width - (e.CellStyle.Padding.Left + e.CellStyle.Padding.Right);
                    int height = 13 + (e.CellStyle.Padding.Top + e.CellStyle.Padding.Bottom);

                    g.FillRectangle(new SolidBrush(bcolor), e.CellBounds);

                    y = y + height - 1;

                    if (e.ColumnIndex == 0)
                    {
                        font = new Font("Tahoma", 8, FontStyle.Bold);

                        if (selected)
                            TextRenderer.DrawText(e.Graphics, producto.nombre, font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                        else
                            TextRenderer.DrawText(e.Graphics, producto.nombre, font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);

                        font = new Font("Tahoma", 8);
                        y = y + height - 1;
                        TextRenderer.DrawText(e.Graphics, "ID: " + producto.productoID.ToString().PadLeft(4, '0'), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    }
                    else
                    {
                        font = new Font("Tahoma", 9, FontStyle.Bold);
                        if (selected)
                            TextRenderer.DrawText(e.Graphics, "S/." + producto.precio.ToString(), font, new Rectangle(x, y, width, height), fcolor, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                        else
                            TextRenderer.DrawText(e.Graphics, "S/." + producto.precio.ToString(), font, new Rectangle(x, y, width, height), System.Drawing.Color.Blue, TextFormatFlags.PreserveGraphicsClipping | TextFormatFlags.EndEllipsis);
                    }
                }

                e.Handled = true;
            }
            else if ((e.ColumnIndex == 0) && (e.RowIndex >= 0))
            {
                e.Paint(e.ClipBounds, e.PaintParts & ~DataGridViewPaintParts.Focus);
                e.Handled = true;
            }
        }

        private void platoDataGridView_RowPostPaint(object sender, DataGridViewRowPostPaintEventArgs e)
        {
            if (e.RowIndex == this.productoBindingSource.Position)
            {
                e.DrawFocus(e.RowBounds, true);
            }
            else
            {
                using (Pen p = new Pen(Color.LightGray))
                {
                    e.Graphics.DrawRectangle(p, e.RowBounds);
                }
            }
        }
    }
}
